// poj2923
// 题意：
// 给定n(<=10)个物品，每个物品有一个重量wi(<=100）。现在有两辆车，容量分别是
// c1和c2(<=100)。每一次运输，两辆车一起运，可以运输不超过自己容量的物品，
// 到目的地再返回，问最少几次运输完所有物品。题目保证一个物品的重量至少
// 小于某辆车的容量。
//
// 题解：
// 一开始想了一个枚举两辆车运了哪些物品再状压，但是想来想去只想到了超时的做法。
//
// 其实可以这么做，预处理出两辆车可以一次运输的合法状态，利用背包来预处理。
// 然后把这些合法状态看作第二次dp的物品，设dp[i][j]表示运了前i个状态的物品，
// 现在运输完的物品状态是j的最小运输次数。这样再做一次背包就行。
//
// run: $exec < input
// opt: 0
// flag: -g
#include <bitset>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>

int const  inf = 1 << 30;
int const maxn = 11;
int a[maxn];
int c[2];
bool f[maxn][101];
int dp[2][1 << 11];
int n;

int main()
{
	std::ios::sync_with_stdio(false);
	int T; std::cin >> T;
	for (int ti = 1; ti <= T; ti++) {
		std::cout << "Scenario #" << ti << ":\n";
		std::cin >> n >> c[0] >> c[1];
		for (int i = 0; i < n; i++) std::cin >> a[i];

		std::vector<int> st;
		for (int i = 0; i < (1 << n); i++) {
			std::vector<int> v;
			int sum = 0;
			for (int j = 0; j < n; j++)
				if ((i >> j) & 1) { v.push_back(a[j]); sum += a[j]; }
			int l = v.size();
			std::memset(f, 0, sizeof(f));
			f[0][0] = true;
			for (int j = 1; j <= l; j++)
				for (int k = 0; k <= c[0]; k++) {
					f[j][k] = f[j - 1][k];
					if (k >= v[j - 1] && f[j - 1][k - v[j - 1]])
						f[j][k] = true;
				}
			int k = c[0];
			for (; k >= 0; k--) if (f[l][k]) break;
			if (sum - k > c[1]) continue;
			st.push_back(i);
//			std::cout << std::bitset<10>(i) << "\n";
		}

		int now = 0, prev = 1;
		for (int i = 0; i < (1 << n); i++) dp[now][i] = inf;
		dp[now][0] = 0;
		for (int i = 0; i < (int)st.size(); i++) {
			now ^= 1; prev ^= 1;
			for (int j = 0; j < (1 << n); j++) {
				dp[now][j] = dp[prev][j];
				if ((j & st[i]) != st[i]) continue;
				dp[now][j] = std::min(dp[now][j], dp[prev][j ^ st[i]] + 1);
			}
		}
		std::cout <<  dp[now][(1 << n) - 1] << "\n\n";
	}
}

